package com.errol.generic.http;

import org.springframework.http.HttpMethod;
import org.springframework.http.HttpStatus;

import java.io.InputStream;

/**
 * @author zhang xiao bin
 * @version v1.0
 * @date 2020/09/28
 * @since v
 **/
public interface HttpComponent {

    /**
     * 由请求地址和请求方法建造基本的 HTTP 对象
     *
     * @param urlWithParams     携带参数的请求地址
     * @param httpMethod        请求方法
     * @param connectionTimeout 连接超时时间
     * @param readTimeout       读超时时间
     * @throws Exception 异常直接抛出，在 HttpBuilder 统一处理
     */
    void generateHttpHeaderBuilder(String urlWithParams, HttpMethod httpMethod, int connectionTimeout, int readTimeout) throws Exception;

    /**
     * 设置 request header
     *
     * @param key   key
     * @param value value
     * @throws Exception 异常直接抛出，在 HttpBuilder 统一处理
     */
    void setRequestHeader(String key, String value) throws Exception;

    /**
     * 将数据写入 requestBody
     *
     * @param data 数据
     * @throws Exception 异常直接抛出，在 HttpBuilder 统一处理
     */
    void writeRequestBody(byte[] data) throws Exception;

    /**
     * 执行 http 请求
     *
     * @return http 响应状态码
     * @throws Exception 异常直接抛出，在 HttpBuilder 统一处理
     */
    HttpStatus execute() throws Exception;

    /**
     * http 请求成功后获取响应体输入流
     *
     * @return responseBody inputStream
     * @throws Exception 异常直接抛出，在 HttpBuilder 统一处理
     */
    InputStream getInputStream() throws Exception;

    /**
     * http 请求失败（400+）后获取错误信息
     * @return
     * @throws Exception
     */
    InputStream getErrorStream() throws Exception;
}
